package ar.uba.fi.algo3.ejemplos.pelotas.controlador;

import java.util.ArrayList;

import ar.uba.fi.algo3.ejemplos.pelotas.modelo.Mesa;
import ar.uba.fi.algo3.ejemplos.pelotas.modelo.Pelota;
import ar.uba.fi.algo3.ejemplos.pelotas.vista.VistaMesa;
import ar.uba.fi.algo3.ejemplos.pelotas.vista.VistaPelota;
import ar.uba.fi.algo3.ejemplos.pelotas.vista.VistaPelota2;
import ar.uba.fi.algo3.titiritero.ControladorJuego;
import ar.uba.fi.algo3.titiritero.ObjetoVivo;
import ar.uba.fi.algo3.titiritero.SuperficieDeDibujo;
import ar.uba.fi.algo3.titiritero.audio.Elemento;

public class EjemploPelotas implements ObjetoVivo{

	private ControladorJuego controlador = null;
	private Pelota unaPelota;
	private Pelota otraPelota;

	
	public EjemploPelotas(SuperficieDeDibujo superficieDeDibujo){
		Mesa unaMesa = new Mesa(200, 200);
		
		this.unaPelota = new Pelota(20,30);
		this.unaPelota.setMesa(unaMesa);
		
		this.otraPelota = new Pelota(80, 130);
		this.otraPelota.setMesa(unaMesa);
		
		unaMesa.agregaObstaculos(this.unaPelota);
		unaMesa.agregaObstaculos(this.otraPelota);

		/*
		 * Luego instancio los objetos del framework: una ventana y el controlador
		 */		
		controlador = new ControladorJuego(true);
		controlador.setSuperficieDeDibujo(superficieDeDibujo);

		
		/*
		 * Instancio un cuadrado para que actue como vista de la mesa
		 */
		VistaMesa vistaMesa = new VistaMesa();
		vistaMesa.setPosicionable(unaMesa);
		
		/*
		 * Instancio una imagen para que actue como vista de la pelota
		 */
		VistaPelota vistaPelota = new VistaPelota();
		vistaPelota.setPosicionable(this.unaPelota);
		
		VistaPelota2 vistaOtraPelota = new VistaPelota2();
		vistaOtraPelota.setPosicionable(this.otraPelota);

		/*
		 * agrego la pelota a la lista de objetos vivios del controlador
		 * para que este le de vida dentro del gameloop
		 */
		controlador.agregarObjetoVivo(unaPelota);
		controlador.agregarObjetoVivo(otraPelota);
		controlador.agregarObjetoVivo(this);
		
		/*
		 * Agrego los objetos que actuan como vista a la lista de dibujables del controlador
		 * para que sean repintados al final de cada gameloop
		 */
		
		controlador.agregarDibujable(vistaMesa);
		controlador.agregarDibujable(vistaPelota);		
		controlador.agregarDibujable(vistaOtraPelota);
		
		controlador.agregarMouseClickObservador(vistaMesa);
		
		/*
		 * finalmente establezco el intervalo de sleep dentro del gameloop
		 * y comienzo a ejecutar
		 */
		controlador.setIntervaloSimulacion(20);
	}
	
	public void comenzar(){
		controlador.comenzarJuegoAsyn();	
	}
	
	public void detener() {
		controlador.detenerJuego();
	}

	
	public void agregarObservadorDeChoques(ObservadorDeChoques observador) {
		this.observadores.add(observador);
	}
	
	private ArrayList<ObservadorDeChoques> observadores = new ArrayList<ObservadorDeChoques>();

	private int cantidadChoques;
	
	@Override
	public void vivir() {
		int nuevaCantidadChoques = this.unaPelota.getCantidadDeChoques() + this.otraPelota.getCantidadDeChoques();
		if(nuevaCantidadChoques != this.cantidadChoques){
			this.cantidadChoques = nuevaCantidadChoques;

			for(int i=cantidadChoques; i <= nuevaCantidadChoques; i++)
				this.controlador.getReproductorDeAudio().reproducir(new Elemento(60, 20));

			for (ObservadorDeChoques observador : this.observadores) {
				observador.seActualizaronLosChoques(cantidadChoques);
			}
		}
	}
}
